package app.vista;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import negocio.Restaurante;
import org.jdesktop.application.Application;
import exceptions.PlatoException;
import beans.IngredienteVO;
import beans.PlatoVO;
import beans.ProductoVO;
import beans.RecetaVO;
import app.Administracion;
import app.Sistema;
import app.Defines;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
@SuppressWarnings("serial")
public class PlatoGUI extends JInternalFrame 
{
	
    private String title;
	private Sistema sis;
    
   	private JComboBox<String> producto;
   	private JComboBox<Integer> cantidad;
   	private JComboBox<String> unidad;

   	private JComboBox<String> restaurantes;
   	
   	private JButton btnAgregarProd;
   	private JButton btnBorrarProd;
   	
   	private JTextArea ingredientesAgregados;
   	private ArrayList<IngredienteVO> ingAgregados = new ArrayList<IngredienteVO>();
   	
	private JTextField txt_precio;
	private JTextField txt_nombre;
	private JComboBox<String> area;
	private JTextField txt_rubro;
	private JTextField txt_comision_extra;

	private JLabel label_precio;
	private JLabel label_nombre;
	private JLabel label_rubro;
	private JLabel label_area;
	private JLabel label_comision_extra;
	private JLabel RestanranteLabel;

	private JButton btnBuscar;
	private JButton btnCancelar;
	private JButton btnConfirmar;

	private static boolean isAltaPlato = false;
	private static boolean isBajaPlato = false;
	private static boolean isModPlato = false;
	private MenuPrincipalView menuPrincipal;
	
	public PlatoGUI(String sTitle, Sistema sis , MenuPrincipalView mp) 
	{
		super(sTitle);
		this.sis = sis;
		this.title = sTitle;
		this.menuPrincipal = mp;
		initGUI();
	}
	
   public static PlatoGUI getInstancia(String sTitle, Sistema sis , MenuPrincipalView mp)
   {
	   return new PlatoGUI(sTitle, sis , mp);
   }
	
	private void initGUI() 
	{
		try 
		{
			this.setPreferredSize(new java.awt.Dimension(696, 253));
	      	this.setBounds(0, 0, 696, 253);
	      	setVisible(true);
	      	setLocation(550, 150);
	       	setTitle(this.title);
	       	setClosable(true);
	       	setSize(304, 253);
	       	setMaximumSize(new Dimension(304, 253));
	       	setMinimumSize(new Dimension(304, 253));
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			
			
			RestanranteLabel = new JLabel();
			getContentPane().add(RestanranteLabel);
			RestanranteLabel.setText("Restaurante:");
			RestanranteLabel.setBounds(12, 21, 85, 16);
			
			restaurantes = new JComboBox<String>();
			for (int i = 0 ; i < sis.getRestaurantesVO().size() ; i++)
			{
				restaurantes.addItem(sis.getRestaurantesVO().get(i).getNombre());
			}
			getContentPane().add(restaurantes);
			restaurantes.setBounds(109, 18, 127, 23);
			
			
			producto = new JComboBox<String>();
			List<ProductoVO> prodsVO = Administracion.getInstancia().getProductosVO();
			for (int i = 0 ; i < prodsVO.size() ; i++)
			{
				producto.addItem(prodsVO.get(i).getNombre());
			}
			getContentPane().add(producto);
			producto.setBounds(384, 56, 152, 23);

			cantidad = new JComboBox<Integer>();
			for (int i = 0 ; i < 11 ; i++)
			{
				cantidad.addItem(i);
			}
			getContentPane().add(cantidad);
			cantidad.setBounds(384, 97, 45, 23);

			unidad = new JComboBox<String>();
			unidad.addItem("KG");
			unidad.addItem("G");
			unidad.addItem("MG");
			unidad.addItem("L");
			unidad.addItem("ML");
			unidad.addItem("CM3");
			getContentPane().add(unidad);
			unidad.setBounds(452, 96, 48, 23);

			btnAgregarProd = new JButton();
			getContentPane().add(btnAgregarProd);
			btnAgregarProd.setText("Agregar Producto");
			btnAgregarProd.setBounds(384, 141, 116, 23);
			btnAgregarProd.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					ProductoVO prod = ProductoVO.getProductoVOByName(producto.getSelectedItem().toString());
					int cant = Integer.parseInt(cantidad.getSelectedItem().toString());
					String unidadS = unidad.getSelectedItem().toString();
					
					IngredienteVO ingVO = new IngredienteVO();
					ingVO.setCantidad(cant);
					ingVO.setProducto(prod);
					ingVO.setUnidad(unidadS);
					
					ingAgregados.add(ingVO);
					actualizarTextAreaIngredientes();
				}
			});
			btnBorrarProd = new JButton();
			getContentPane().add(btnBorrarProd);
			btnBorrarProd.setText("Borrar Producto");
			btnBorrarProd.setBounds(384, 181, 116, 23);
			btnBorrarProd.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					for (int i = 0 ; i < ingAgregados.size() ; i++)
					{
						if (ingAgregados.get(i).getProducto().getNombre().equals(producto.getSelectedItem().toString()))
						{
							ingAgregados.remove(i);
							break;
						}
					}
					actualizarTextAreaIngredientes();
				}
			});
			
			label_precio = new JLabel();
			getContentPane().add(label_precio);
			label_precio.setText("Precio:");
			label_precio.setBounds(26, 230, 101, 16);

			txt_precio = new JTextField();
			getContentPane().add(txt_precio);
			txt_precio.setBounds(139, 227, 193, 23);

			label_nombre = new JLabel();
			getContentPane().add(label_nombre);
			label_nombre.setText("Nombre:");
			label_nombre.setBounds(26, 265, 101, 16);
			
			txt_nombre = new JTextField();
			getContentPane().add(txt_nombre);
			txt_nombre.setBounds(139, 262, 193, 23);

			label_rubro = new JLabel();
			getContentPane().add(label_rubro);
			label_rubro.setText("Rubro:");
			label_rubro.setBounds(26, 300, 101, 16);
			
			txt_rubro = new JTextField();
			getContentPane().add(txt_rubro);
			txt_rubro.setBounds(139, 297, 193, 23);

			label_area = new JLabel();
			getContentPane().add(label_area);
			label_area.setText("Area:");
			label_area.setBounds(26, 335, 100, 16);
			
			area = new JComboBox<String>();
			area.addItem("Barra");
			area.addItem("Cafeteria");
			area.addItem("Cocina");
			getContentPane().add(area);
			area.setBounds(138, 332, 193, 23);

			label_comision_extra = new JLabel();
			getContentPane().add(label_comision_extra);
			label_comision_extra.setText("Comision Extra:");
			label_comision_extra.setBounds(26, 370, 101, 16);
			
			txt_comision_extra = new JTextField();
			getContentPane().add(txt_comision_extra);
			txt_comision_extra.setBounds(139, 367, 193, 23);
			
			ingredientesAgregados = new JTextArea();
			getContentPane().add(ingredientesAgregados);
			ingredientesAgregados.setBounds(12, 56, 350, 149);
			ingredientesAgregados.setName("ingredientesAgregados");

			btnBuscar = new JButton();
			getContentPane().add(btnBuscar);
			btnBuscar.setText("Buscar");
			btnBuscar.setBounds(390, 298, 116, 23);
			btnBuscar.setName("btnBuscar");
			btnBuscar.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					try 
					{
						btnBuscarActionPerformed(evt);
					} 
					catch (PlatoException e) 
					{
						e.printStackTrace();
					}
				}
			});
			btnConfirmar = new JButton();
			getContentPane().add(btnConfirmar);
			btnConfirmar.setText("Confirmar");
			btnConfirmar.setBounds(390, 332, 116, 23);
			btnConfirmar.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					btnConfirmarActionPerformed(evt);
				}
			});
			btnCancelar = new JButton();
			getContentPane().add(btnCancelar);
			btnCancelar.setText("Cancelar");
			btnCancelar.setBounds(390, 366, 116, 23);
			btnCancelar.addActionListener(new ActionListener() 
			{
				public void actionPerformed(ActionEvent evt) 
				{
					cancelarActionPerformed(evt);
				}
			});

	       if (title.equals(Defines.altaPlato)) 
	       {
	    	   
				isAltaPlato = true;
	        	isBajaPlato = false;
	        	isModPlato = false;
				screenDisabledMode();
	        	
			 	//JText
				txt_precio.setVisible(true);
				txt_nombre.setVisible(true);
				txt_rubro.setVisible(true);
				area.setVisible(true);
				txt_comision_extra.setVisible(true);

				//JLabel
				label_precio.setVisible(true);
				label_nombre.setVisible(true);
				label_rubro.setVisible(true);
				label_area.setVisible(true);
				label_comision_extra.setVisible(true);
				RestanranteLabel.setVisible(true);
				
				//JButton
				btnBuscar.setVisible(true);
				btnCancelar.setVisible(true);
				btnConfirmar.setVisible(true);
				
				//Manejo de Items
			   	producto.setVisible(true);
			   	cantidad.setVisible(true);
			   	unidad.setVisible(true);
			   	btnAgregarProd.setVisible(true);
			   	btnBorrarProd.setVisible(true);

	    		//JButton
	    		btnBuscar.setVisible(false);
	    		btnCancelar.setVisible(true);
	    		btnConfirmar.setVisible(true);
			}
	        if (title.equals(Defines.bajaPlato)) 
	        {
	        	isBajaPlato = true;
	        	isAltaPlato = false;
	        	isModPlato = false;
	        	screenDisabledMode();
	        	
	        	
			 	//JText
				txt_precio.setVisible(true);
				txt_nombre.setVisible(true);
				txt_rubro.setVisible(true);
				area.setVisible(true);
				txt_comision_extra.setVisible(true);

				//JLabel
				label_precio.setVisible(true);
				label_nombre.setVisible(true);
				label_rubro.setVisible(true);
				label_area.setVisible(true);
				label_comision_extra.setVisible(true);
				RestanranteLabel.setVisible(true);
				
				//Manejo de Items
			   	producto.setVisible(false);
			   	cantidad.setVisible(false);
			   	unidad.setVisible(false);
			   	btnAgregarProd.setVisible(false);
			   	btnBorrarProd.setVisible(false);
			   	
			   	ingredientesAgregados.setVisible(false);
	    		
	    		//JButton Enabled
	    		btnBuscar.setEnabled(true);
	    		btnBuscar.setVisible(true);
	    		btnCancelar.setEnabled(true);
	    		btnCancelar.setVisible(true);
	    		btnConfirmar.setEnabled(false);

	        	//JText
	    		txt_precio.setEditable(false);
	    		txt_nombre.setEditable(true);
	    		txt_rubro.setEditable(false);
	    		area.setEditable(false);
	    		txt_comision_extra.setEditable(false);
	    		producto.setEditable(false);
			   	cantidad.setEditable(false);
			   	unidad.setEditable(false);
	       }
	       if (title.equals(Defines.modifPlato)) 
	       {
	    	   	isAltaPlato = false;
	        	isBajaPlato = false;
	        	isModPlato = true;
	        	screenDisabledMode();
	        	
	        	//JText
				txt_precio.setVisible(true);
				txt_nombre.setVisible(true);
				txt_rubro.setVisible(true);
				area.setVisible(true);
				txt_comision_extra.setVisible(true);

				//JLabel
				label_precio.setVisible(true);
				label_nombre.setVisible(true);
				label_rubro.setVisible(true);
				label_area.setVisible(true);
				label_comision_extra.setVisible(true);
				RestanranteLabel.setVisible(true);
				
				//Manejo de Items
			   	producto.setVisible(false);
			   	cantidad.setVisible(false);
			   	unidad.setVisible(false);
			   	btnAgregarProd.setVisible(false);
			   	btnBorrarProd.setVisible(false);

			   	ingredientesAgregados.setVisible(false);
	    		
			  //JButton Enabled
				btnBuscar.setEnabled(true);
				btnBuscar.setVisible(true);
				btnCancelar.setEnabled(true);
				btnCancelar.setVisible(true);
				btnConfirmar.setEnabled(false);

	        	//JText
	    		txt_precio.setEditable(false);
	    		txt_nombre.setEditable(true);
	    		txt_rubro.setEditable(false);
	    		area.setEditable(false);
	    		txt_comision_extra.setEditable(false);
	    		producto.setEditable(false);
			   	cantidad.setEditable(false);
			   	unidad.setEditable(false);
	       }
			pack();
			this.setSize(550, 424);
			this.setName("this");
			Application.getInstance().getContext().getResourceMap(getClass()).injectComponents(this);
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}
	private void screenDisabledMode()
	{
	 	//JText
		txt_precio.setVisible(false);
		txt_nombre.setVisible(false);
		txt_rubro.setVisible(false);
		area.setVisible(false);
		txt_comision_extra.setVisible(false);

		//JLabel
		label_precio.setVisible(false);
		label_nombre.setVisible(false);
		label_rubro.setVisible(false);
		label_area.setVisible(false);
		label_comision_extra.setVisible(false);
		RestanranteLabel.setVisible(false);
		
		//JButton
		btnBuscar.setVisible(false);
		btnCancelar.setVisible(false);
		btnConfirmar.setVisible(false);
		
		//Manejo de Items
	   	producto.setVisible(false);
	   	cantidad.setVisible(false);
	   	unidad.setVisible(false);
	   	btnAgregarProd.setVisible(false);
	   	btnBorrarProd.setVisible(false);
	}

	private void btnConfirmarActionPerformed(ActionEvent evt) 
	{
		///VALIDACIONES
		if(validarDatosConfirmar())
		{
			if (isAltaPlato) 
			{
				//Agregar Plato
				RecetaVO receta = new RecetaVO();
				receta.setIngredientes(ingAgregados);
				PlatoVO platoVO = new PlatoVO();
				if (area.getSelectedItem().toString().equals("Barra"))
				{
					platoVO.setArea(Defines.Barra);
				}
				else if (area.getSelectedItem().toString().equals("Cocina"))
				{
					platoVO.setArea(Defines.Cocina);
				}
				else if (area.getSelectedItem().toString().equals("Cafeteria"))
				{
					platoVO.setArea(Defines.Cafeteria);
				}
				platoVO.setComision_extra(Float.parseFloat(txt_comision_extra.getText()));
				platoVO.setNombre(txt_nombre.getText());
				platoVO.setPrecio(Float.parseFloat(txt_precio.getText()));
				platoVO.setReceta(receta);
				platoVO.setRubro(txt_rubro.getText());
				
				try 
				{
					String restName = restaurantes.getSelectedItem().toString();
					Restaurante rest = sis.getRestauranteByName(restName);
					rest.inicializarRestaurante();
					rest.agregarPlato(platoVO);
				} 
				catch (PlatoException e) 
				{
					e.printStackTrace();
				}
				
				ingAgregados = new ArrayList<IngredienteVO>();
				ingredientesAgregados.setText("");
				txt_precio.setText("");
				txt_nombre.setText("");
				txt_rubro.setText("");
				txt_comision_extra.setText("");
				
				
			}
			if(isBajaPlato)
			{
				//Baja Plato
				try 
				{
					String restName = restaurantes.getSelectedItem().toString();
					Restaurante rest = sis.getRestauranteByName(restName);
					rest.inicializarRestaurante();
					rest.eliminarPlato(txt_nombre.getText());
				}
				catch (PlatoException e) 
				{
					e.printStackTrace();
				}

				btnBuscar.setEnabled(true);
				btnConfirmar.setVisible(true);
				btnConfirmar.setEnabled(false);
			}
			if(isModPlato)
			{
				//Modif Plato
				RecetaVO receta = new RecetaVO();
				receta.setIngredientes(ingAgregados);
				PlatoVO platoVO = new PlatoVO();
				if (area.getSelectedItem().toString().equals("Barra"))
				{
					platoVO.setArea(Defines.Barra);
				}
				else if (area.getSelectedItem().toString().equals("Cocina"))
				{
					platoVO.setArea(Defines.Cocina);
				}
				else if (area.getSelectedItem().toString().equals("Cafeteria"))
				{
					platoVO.setArea(Defines.Cafeteria);
				}
				platoVO.setComision_extra(Float.parseFloat(txt_comision_extra.getText()));
				platoVO.setNombre(txt_nombre.getText());
				platoVO.setPrecio(Float.parseFloat(txt_precio.getText()));
				platoVO.setReceta(receta);
				platoVO.setRubro(txt_rubro.getText());
				
				try 
				{
					String restName = restaurantes.getSelectedItem().toString();
					Restaurante rest = sis.getRestauranteByName(restName);
					rest.inicializarRestaurante();
					rest.modifPlato(platoVO);
				} 
				catch (PlatoException e) 
				{
					e.printStackTrace();
				}

				btnBuscar.setEnabled(true);
				btnConfirmar.setEnabled(false);
				
			}
		}
		menuPrincipal.refreshTables();
	}
	
	private void btnBuscarActionPerformed(ActionEvent evt) throws PlatoException 
	{
		if(validarDatosBuscar())
		{
			if (isBajaPlato) 
			{
				String restName = restaurantes.getSelectedItem().toString();
				Restaurante rest = sis.getRestauranteByName(restName);
				rest.inicializarRestaurante();
				PlatoVO c = rest.buscarPlatoVO(txt_nombre.getText());
				
				if(c != null)
				{
					txt_precio.setText(String.valueOf(c.getPrecio()));
					txt_nombre.setText(c.getNombre());
					txt_rubro.setText(c.getRubro());
					txt_precio.setText(String.valueOf(c.getPrecio()));
					txt_comision_extra.setText(String.valueOf(c.getComision_extra()));
					
		    		if (c.getArea().equals("Barra"))
		    		{
		    			area.setSelectedIndex(0);
		    		}
		    		else if (c.getArea().equals("Cafeteria"))
		    		{
		    			area.setSelectedIndex(1);
		    		}
		    		else if (c.getArea().equals("Cocina"))
		    		{
		    			area.setSelectedIndex(2);
		    		}

		    		txt_comision_extra.setText(String.valueOf(c.getComision_extra()));
				   	for (int j = 0 ; j < c.getReceta().getIngredientes().size() ; j++)
				   	{
				   		String nombre 	= "Nombre: " + c.getReceta().getIngredientes().get(j).getProducto().getNombre();
				   		String cantidad = " Cantidad: " + String.valueOf(c.getReceta().getIngredientes().get(j).getCantidad());
				   		String unidad 	= " Unidad: " + c.getReceta().getIngredientes().get(j).getUnidad();
				   		
				   		ingredientesAgregados.append(nombre + cantidad + unidad);
				   		ingredientesAgregados.append("\n");
				   	}

					//JText
					txt_precio.setVisible(true);
					txt_nombre.setVisible(true);
					txt_rubro.setVisible(true);
					area.setVisible(true);
					txt_comision_extra.setVisible(true);
					
					btnBuscar.setEnabled(false);
					btnConfirmar.setVisible(true);
					btnConfirmar.setEnabled(true);
					
					//Manejo de Items
					ingredientesAgregados.setVisible(true);
					
					txt_nombre.setEditable(false);
				}
			}
			if(isModPlato)
			{
				String restName = restaurantes.getSelectedItem().toString();
				Restaurante rest = sis.getRestauranteByName(restName);
				rest.inicializarRestaurante();
				PlatoVO c = rest.buscarPlatoVO(txt_nombre.getText());
				
				if(c != null)
				{
					txt_precio.setText(String.valueOf(c.getPrecio()));
					txt_nombre.setText(c.getNombre());
					txt_rubro.setText(c.getRubro());
					txt_precio.setText(String.valueOf(c.getPrecio()));
					txt_comision_extra.setText(String.valueOf(c.getComision_extra()));
					
		    		if (c.getArea().equals("Barra"))
		    		{
		    			area.setSelectedIndex(0);
		    		}
		    		else if (c.getArea().equals("Cafeteria"))
		    		{
		    			area.setSelectedIndex(1);
		    		}
		    		else if (c.getArea().equals("Cocina"))
		    		{
		    			area.setSelectedIndex(2);
		    		}

		    		txt_comision_extra.setText(String.valueOf(c.getComision_extra()));
				   	for (int j = 0 ; j < c.getReceta().getIngredientes().size() ; j++)
				   	{
				   		String nombre 	= "Nombre: " + c.getReceta().getIngredientes().get(j).getProducto().getNombre();
				   		String cantidad = " Cantidad: " + String.valueOf(c.getReceta().getIngredientes().get(j).getCantidad());
				   		String unidad 	= " Unidad: " + c.getReceta().getIngredientes().get(j).getUnidad();
				   		
				   		ingredientesAgregados.append(nombre + cantidad + unidad);
				   		ingredientesAgregados.append("\n");
				   	}

					//JText
					txt_precio.setVisible(true);
					txt_nombre.setVisible(true);
					txt_rubro.setVisible(true);
					area.setVisible(true);
					txt_comision_extra.setVisible(true);
					
					txt_precio.setEditable(true);
					txt_rubro.setEditable(true);
					txt_comision_extra.setEditable(true);
					
					btnBuscar.setEnabled(false);
					btnConfirmar.setVisible(true);
					btnConfirmar.setEnabled(true);
					
					//Manejo de Items
					ingredientesAgregados.setVisible(true);
					
					txt_nombre.setEditable(false);
				}
			}
		}
	}
	
	private boolean validarDatosBuscar() 
	{
		return true;
	}

	private boolean validarDatosConfirmar() 
	{
		return true;
	}
	
	private void cancelarActionPerformed(ActionEvent evt) 
	{
		this.dispose();
	}
	
	private void actualizarTextAreaIngredientes()
	{
		ingredientesAgregados.setText("");
		for (int i = 0 ; i < ingAgregados.size() ; i++)
		{
			ingredientesAgregados.append(ingAgregados.get(i).getProducto().getNombre() + " " + ingAgregados.get(i).getCantidad() + " " + ingAgregados.get(i).getUnidad());
			ingredientesAgregados.append("\n");
		}
	}
}